package com.xb.loan.admin.service.dict.impl;

import com.xb.loan.admin.bean.dict.DictEnum;
import com.xb.loan.admin.dao.dict.DictEnumDao;
import com.xb.loan.admin.service.dict.DictEnumService;
import com.xb.loan.log.exception.BizException;
import com.xb.loan.util.cache.DefaultCacheFactory;
import com.xb.loan.util.common.ObjectOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


@Service("dictEnumService")
public class DictEnumServiceImpl implements DictEnumService {

    @Autowired
    DictEnumDao dictEnumDao;
  
    @Override
    public List<DictEnum> queryDictEnumByType(String enumType) throws BizException {
        List<DictEnum> list =  DefaultCacheFactory.getFacotry().getCache().getBeans(DictEnum.class);

        if (list == null || list.isEmpty()) {
            list = ObjectOperation.convertByClassesList(dictEnumDao.selectByType(enumType), DictEnum.class);
            if (list!=null && list.size()>0) {
                for(DictEnum devo : list){
                    DefaultCacheFactory.getFacotry().getCache().setBean(DictEnum.class,enumType+devo.getEnumCode(),devo);
                }
            }
        }else{
            List<DictEnum> deList=new ArrayList<DictEnum>();
            for(DictEnum de:list){
                if(enumType.equals(de.getEnumType())){
                    deList.add(de);
                }
            }
            if(deList ==null || deList.isEmpty() ){
                list = ObjectOperation.convertByClassesList(dictEnumDao.selectByType(enumType), DictEnum.class);
                if (list!=null && list.size()>0) {
                    for(DictEnum devo : list){
                        DefaultCacheFactory.getFacotry().getCache().setBean(DictEnum.class,enumType+devo.getEnumCode(),devo);
                    }
                }
                return list;
            }
            return deList;
        }
        return list;
    }


    @Override
    public DictEnum queryDictEnumByTypeAndCode(String enumType, String enumCode) throws BizException {
        DictEnum DictEnum =  DefaultCacheFactory.getFacotry().getCache().getBean(DictEnum.class,enumType+enumCode);

        if (DictEnum == null) {
            Map<String,String> map = new HashMap<String,String>();
            map.put("enumType", enumType);
            map.put("enumCode", enumCode);
            
            DictEnum = ObjectOperation.convertByClasses(dictEnumDao.selectByTypeAndCode(map), DictEnum.class);
            if (DictEnum != null ) {
                   DefaultCacheFactory.getFacotry().getCache().setBean(DictEnum.class, 
                           DictEnum.getEnumType()+DictEnum.getEnumCode(), DictEnum);
            }
        }
        return DictEnum;
    }


    @Override
    public int insertDictEnum(DictEnum DictEnum) throws BizException {        
        DictEnum dictEnum = ObjectOperation.convertByClasses(DictEnum, DictEnum.class);
        if(dictEnumDao.insertSelective(dictEnum) > 0){
            DefaultCacheFactory.getFacotry().getCache().setBean(DictEnum.class, 
                    DictEnum.getEnumType()+DictEnum.getEnumCode(), DictEnum);          
            return 1;
        }
        return 0;
    }


    @Override
    public int deleteByTypeAndCode(String enumType, String enumCode) throws BizException {
        Map<String,String> map = new HashMap<String,String>();
        map.put("enumType", enumType);
        map.put("enumCode", enumCode);
        
        DictEnum dictEnum = dictEnumDao.selectByTypeAndCode(map);        
        if(dictEnum != null){
            if(dictEnumDao.deleteByTypeAndCode(map) > 0){
                DefaultCacheFactory.getFacotry().getCache().removeBean(DictEnum.class, enumType+enumCode);
                return 1;
            }
        }        
        return 0;
    }

}
